<!doctype html>
<html lang="en" class="page-type-section">
<head prefix="og: http://ogp.me/ns#">
<meta charset="utf-8">
<title>标量 - FreeMarker 手册</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="format-detection" content="telephone=no">
<meta property="og:site_name" content="FreeMarker 手册">
<meta property="og:title" content="标量">
<meta property="og:locale" content="en_US">
<meta property="og:url" content="http://freemarker.org/docs/pgui_datamodel_scalar.html">
<link rel="canoical" href="http://freemarker.org/docs/pgui_datamodel_scalar.html">
<link rel="icon" href="favicon.png" type="image/png">
<link rel="stylesheet" type="text/css" href="docgen-resources/docgen.min.css">
</head>
<body itemscope itemtype="https://schema.org/Code">
    <meta itemprop="url" content="http://freemarker.org/docs/">
    <meta itemprop="name" content="FreeMarker 手册">

  <!--[if lte IE 9]>
  <div style="background-color: #C00; color: #fff; padding: 12px 24px;">Please use a modern browser to view this website.</div>
  <![endif]--><div class="header-top-bg"><div class="site-width header-top"><a class="logo" href="http://freemarker.org" role="banner">            <img itemprop="image" src="logo.png" alt="FreeMarker">
</a><ul class="tabs"><li><a href="http://freemarker.org/">Home</a></li><li class="current"><a href="index.html">Manual</a></li><li><a class="external" href="http://freemarker.org/docs/api/index.html">Java API</a></li></ul><ul class="secondary-tabs"><li><a class="tab icon-heart" href="http://freemarker.org/contribute.html" title="Contribute"><span>Contribute</span></a></li><li><a class="tab icon-bug" href="https://sourceforge.net/p/freemarker/bugs/new/" title="Report a Bug"><span>Report a Bug</span></a></li><li><a class="tab icon-download" href="http://freemarker.org/freemarkerdownload.html" title="Download"><span>Download</span></a></li></ul></div></div><div class="header-bottom-bg"><div class="site-width search-row"><a href="toc.html" class="navigation-header">Manual</a><div class="navigation-header"></div></div><div class="site-width breadcrumb-row"><ul class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList"><li class="step-0" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="toc.html"><span itemprop="name">FreeMarker 手册</span></a></li><li class="step-1" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="pgui.html"><span itemprop="name">程序开发指南</span></a></li><li class="step-2" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="pgui_datamodel.html"><span itemprop="name">数据模型</span></a></li><li class="step-3" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="pgui_datamodel_scalar.html"><span itemprop="name">标量</span></a></li></ul><div class="bookmarks" title="Bookmarks"><span class="sr-only">Bookmarks:</span><ul class="bookmark-list"><li><a href="alphaidx.html">Alpha. index</a></li><li><a href="gloss.html">Glossary</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions</a></li><li><a href="ref_builtins_alphaidx.html">?builtins</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_specvar.html">.spec_vars</a></li><li><a href="app_faq.html">FAQ</a></li></ul></div></div></div>    <div class="main-content site-width">
      <div class="content-wrapper">
  <div id="table-of-contents-wrapper" class="col-left">
      <script>var breadcrumb = ["FreeMarker 手册","程序开发指南","数据模型","标量"];</script>
      <script src="toc.js"></script>
      <script src="docgen-resources/main.min.js"></script>
  </div>
<div class="col-right"><div class="page-content"><div class="page-title"><div class="pagers top"><a class="paging-arrow previous" href="pgui_datamodel_basics.html"><span>Previous</span></a><a class="paging-arrow next" href="pgui_datamodel_parent.html"><span>Next</span></a></div><div class="title-wrapper">
<h1 class="content-header header-section1" id="pgui_datamodel_scalar" itemprop="headline">标量</h1>
</div></div><p>有4种类型的标量：</p><ul>
          <li>
            布尔值
          </li>

          <li>
            数字
          </li>

          <li>
            字符串
          </li>

          <li>
            日期类型(子类型： 日期(没有时间部分)，时间或者日期-时间)
          </li>
        </ul><p>每一种标量类型都是
        <code class="inline-code">Template<em class="code-color">Type</em>Model</code>
        接口的实现，这里的 <code class="inline-code"><em class="code-color">Type</em></code> 
		就是类型的名称。这些接口只定义了一个方法：
        <code class="inline-code"><em class="code-color">type</em>
        getAs<em class="code-color">Type</em>();</code>。
		它返回变量的Java类型(<code class="inline-code">boolean</code>，
        <code class="inline-code">Number</code>， <code class="inline-code">String</code> 和
        <code class="inline-code">Date</code> 各自代表的值)。</p>  <div class="callout note">
    <strong class="callout-label">Note:</strong>

          <p>由于历史遗留的原因，字符串标量的接口是
		  <code class="inline-code">TemplateScalarModel</code>，而不是
          <code class="inline-code">TemplateStringModel</code>。
		  (因为早期的 FreeMarker 字符串就是标量。)</p>
          </div>
<p>这些接口的一个细小的实现和 
		<code class="inline-code">Simple<em class="code-color">Type</em></code> 
		类名在 <code class="inline-code">freemarker.template</code> 包中是可用的。
		但是却没有 <code class="inline-code">SimpleBooleanModel</code> 类型；为了代表布尔值，
		可以使用 <code class="inline-code">TemplateBooleanModel.TRUE</code> 和 
		<code class="inline-code">TemplateBooleanModel.FALSE</code> 来单独使用。</p>  <div class="callout note">
    <strong class="callout-label">Note:</strong>

          <p>由于历史遗留的原因，字符串标量的实现类是 
		  <code class="inline-code">SimpleScalar</code>，而不是 
		  <code class="inline-code">SimpleString</code>。</p>
          </div>
<p>在FTL中标量是一成不变的。当在模板中设置变量的值时，
		使用其他的实例来替换 
		<code class="inline-code">Template<em class="code-color">Type</em>Model</code> 实例时，
		是不用改变原来实例中存储的值的。</p>
          



<h2 class="content-header header-section2" id="autoid_29">"日期" 类型的难点</h2>


          

          

          <p>对于日期类型来说，有一些难题，因为Java API通常不区别 
		  <code class="inline-code">java.util.Date</code> 只存储日期部分(April 4, 2003)，
		  时间部分(10:19：18 PM)，或两者都存(April 4, 2003 10:19:18 PM)。
		  为了用本文正确显示值(或者进行其它确定的操作)，FreeMarker必须知道 
		  <code class="inline-code">java.util.Date</code> 的哪个部分存储了有意义上的信息，
		  哪部分没有被使用(通常是标记为0的)。不幸的是，
		  通常该信息只是当值从数据库中取得时可用，
		  因为大多数数据库有独立的日期，时间和日期-时间(又叫做时间戳)类型，
		  <code class="inline-code">java.sql</code> 有3个对应的 
		  <code class="inline-code">java.util.Date</code> 子类和它们相匹配。</p>

          <p><code class="inline-code">TemplateDateModel</code> 接口有两个方法：分别是
		  <code class="inline-code">java.util.Date getAsDate()</code> 和 <code class="inline-code">int getDateType()</code>。
		  该接口典型的实现是存储一个 <code class="inline-code">java.util.Date</code> 对象，
		  加上一个整数来辨别子类型。这个整数的值也必须是 <code class="inline-code">TemplateDateModel</code> 
		  接口中的常量之一：<code class="inline-code">DATE</code>， <code class="inline-code">TIME</code>，
          <code class="inline-code">DATETIME</code> 和 <code class="inline-code">UNKNOWN</code>。</p>

          <p>关于 <code class="inline-code">UNKNOWN</code>: <code class="inline-code">java.lang</code>
          和 <code class="inline-code">java.util</code> 下的类通常被自动转换成 
		  <code class="inline-code">TemplateModel</code> 的实现类，就是所谓的 
		  <code class="inline-code">对象包装器ObjectWrapper</code>(请参考之前的对象包装介绍)。
		  如果对象包装器要包装 <code class="inline-code">java.util.Date</code> 类，
		  它不是 <code class="inline-code">java.sql</code> 日期类的实例，那就不能决定子类型是什么，
		  所以使用 <code class="inline-code">UNKNOWN</code>。之后，如果模板需要使用这个变量，
		  而且操作也需要子类型，那就会停止执行并抛出错误。为了避免这种情况的发生，
		  对于那些可能有问题的变量，模板开发人员必须明确地指定子类型，使用内建函数 <a href="ref_builtins_date.html#ref_builtin_date_datetype"><code>date</code>，
		  <code>time</code> 或 <code>datetime</code></a>
		  (比如 <code class="inline-code">lastUpdated?datetime</code>)。请注意，
		  如果和格式化参数一起使用内建函数 <code class="inline-code">string</code>，
		  比如foo?string(&quot;MM/dd/yyyy&quot;)，那么 FreeMarker 就不必知道子类型了。</p>
        <div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="pgui_datamodel_basics.html"><span>Previous</span></a><a class="paging-arrow next" href="pgui_datamodel_parent.html"><span>Next</span></a></div></div></div></div>      </div>
    </div>
<div class="site-footer"><div class="site-width"><div class="footer-top"><div class="col-left sitemap"><div class="column"><h3 class="column-header">Overview</h3><ul><li><a href="http://freemarker.org/index.html">What is FreeMarker?</a></li><li><a href="http://freemarker.org/freemarkerdownload.html">Download</a></li><li><a href="app_versions.html">Version history</a></li><li><a href="http://freemarker.org/history.html">About us</a></li><li><a itemprop="license" href="app_license.html">License</a></li></ul></div><div class="column"><h3 class="column-header">Handy stuff</h3><ul><li><a href="http://freemarker-online.kenshoo.com/">Try template online</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions cheatsheet</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_builtins_alphaidx.html">?built_ins</a></li><li><a href="ref_specvar.html">.special_vars</a></li></ul></div><div class="column"><h3 class="column-header">Community</h3><ul><li><a href="https://github.com/nanlei/freemarker/tree/manual-zh-2.3-gae/src/manual">Chinese Manual on Github</a></li><li><a href="https://github.com/freemarker/freemarker">FreeMarker on Github</a></li><li><a href="https://twitter.com/freemarker">Follow us on Twitter</a></li><li><a href="https://sourceforge.net/p/freemarker/bugs/new/">Report a bug</a></li><li><a href="http://stackoverflow.com/questions/ask?tags=freemarker">Ask a question</a></li><li><a href="http://freemarker.org/mailing-lists.html">Mailing lists</a></li></ul></div></div><div class="col-right"><ul class="social-icons"><li><a class="github" href="https://github.com/freemarker/freemarker">Github</a></li><li><a class="twitter" href="https://twitter.com/freemarker">Twitter</a></li><li><a class="stack-overflow" href="http://stackoverflow.com/questions/ask?tags=freemarker">Stack Overflow</a></li></ul><a class="xxe" href="http://www.xmlmind.com/xmleditor/" rel="nofollow" title="Edited with XMLMind XML Editor"><span>Edited with XMLMind XML Editor</span></a></div></div><div class="footer-bottom"><p><span class="generated-for-product">Generated for: Freemarker 2.3.23</span><span class="last-updated"> Last generated:
<time itemprop="dateModified" datetime="2015-09-18T14:38:51Z" title="Friday, September 18, 2015 2:38:51 PM GMT">2015-09-18 14:38:51 GMT</time></span></p> <p class="copyright">
© <span itemprop="copyrightYear">1999</span>–2015
<a itemtype="http://schema.org/Organization" itemprop="copyrightHolder" href="http://freemarker.org">The FreeMarker Project</a>. All rights reserved. </p>
</div></div></div></body>
</html>
